﻿% Вторая глава работы 
\chapter{Теория}
\label{chap2}

\section{Использованные средства}
\label{chap2:sec1}

\textbf{PHP}
PHP (PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста») — скриптовый язык программирования общего назначения, интенсивно применяющийся для разработки веб--приложений.
В настоящее время он поддерживается подавляющим большинством хостинг-провайдеров и является лидеров среди языков программирования, применяющихся для создания динамических веб--сайтов. 
Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом. Продукт не является свободным и распространяется под собственной лицензией.
Вся лабораторная работа написана на PHP.

\textbf{HTML}
HTML (HyperText Markup Language — «язык разметки гипертекста») — стандартный язык разметки документов во Всемирной паутине.
Все веб--страницы создаются при помощи языка HTML (или XHTML). Этот язык интерпретируется браузером, который на основе текстового описания отображает страницу.

В данной работе были использованы только базовые возможности языка, а именно:
\begin{itemize}
\item Описание метаданных при помощи тега <meta>.
\item Форма и элементы управления (теги <form>, <input>, <select>).
\item Таблица для упорядоченного отображения элементов управления (<table>)
\item Подключение внешних ресурсов, таких как CSS--файлы и пиктограмма (<link>).
\end{itemize}

\textbf{CSS}
Каскадные таблицы стилей (Cascading Style Sheets, CSS) позволяют хранить цвет, размеры текста и другие параметры в стилях.
Стилем называется набор правил форматирования, который применяется к элементу документа, чтобы быстро изменить его внешний вид.

Стили позволяют одним действием применить сразу всю группу атрибутов форматирования.
С их помощью можно, например, изменить вид всех заголовков.
Вместо форматирования заголовка в три приема, когда сначала задается его размер, затем шрифт "Arial" и, наконец, выравнивание по центру, то же самое можно сделать одновременно, применив стиль к тегу <h1>. 
Если требуется быстро изменить внешний вид текста, созданного с помощью одного из стилей, достаточно изменить параметры стиля во всех документах, где он используется, и вид текста поменяется автоматически.

\section{Принципы проектирования}
\label{chap2:sec2}

\textbf{Модель-представление-контроллер}
Model-view-controller (MVC) — принцип проектирования программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента.
Это деление предполагает, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.
\begin{itemize}
\item Модель (Model). Модель предоставляет данные (обычно для представления), а также реагирует на запросы (обычно от контроллер), изменяя свое состояние.
\item Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
\item Контроллер (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.
\end{itemize}
Важно отметить, что как представление, так и контроллер зависят от модели.
Однако обратной зависимости не наблюдается.
Это является одним из ключевых достоинств подобного разделения.
Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
Впервые данный принцип проектирования был предложен для языка Smalltalk.

\textbf{Повторное использование кода}
Суть данного принципа проектирования компьютерных и других систем заключается в том, что система (компьютерная программа, программный модуль) частично либо полностью составляется из частей, написанных ранее.
Повторное использование — основная методология, которая применяется для сокращения трудозатрат при разработке сложных систем.
Самый распространённый случай повторного использования кода — программные библиотеки.
Они предоставляют общую достаточно универсальную функциональность, покрывающую избранную предметную область. 

Преимущества:
\begin{enumerate}
\item Снижение временных затрат.
\item Повышение уровня абстракции.
\end{enumerate}

Недостатки
\begin{enumerate}
\item Повышение финансовых затрат.
\item Зависимость от разработчика стороннего компонента.
\end{enumerate}

\section{Алгоритм}
\label{chap2:sec3}

\textbf{Уточнение задания}
Поскольку задание имеет достаточно свободную формулировку, необходимо определиться с некоторыми моментами.
\begin{enumerate}
\item Первый выбор, который делает пользователь --- выбор пола.
\item Переменная запроса, в которой передается выбранное значение пола --- gender.
\end{enumerate}


\textbf{Входная точка}
Все запросы поступают на скрипт index.php.
Он представляет собой HTML-каркас, внутри которого отображается тот или иной шаблон в зависимости от запроса.
Таким образом, index.php является основной частью Представления в архитектуре MVC.

\textbf{Обработка запроса}
Вся логика приложения сосредоточена внутри контроллера (php/controller.php).
Вкратце, его работу можно описать следующим образом:
\begin{itemize}
\item Если запрос не содержит переменную gender, то отображается форма выбора пола.
\item Если переменная содежится в запросе, ее значение используется для отображения той или иной анкеты (в зависимости от пола).
\item Введенные в анкету данные подвергаются проверке.
\item В случае успешной проверки информация отправляется на почту.
\item Иначе анкета отображается вновь, на этот раз с описанием ошибок рядом с неправильно заполненными полями.
\end{itemize}

\textbf{Конфигурация}
Задание предусматривает возможность конфигурации почтового адреса, на который отправляется результат заполнения анкеты.
Чтобы его изменить, достаточно поправить файл php/config.php.

Кроме почтового адреса, конфигурационный файл содержит пару удобных функций.
Первая автоматически включает в скрипт все необходимые файлы (этот процесс называется автозагрузкой, от англ. autoloading).
Вторая является интерфейсом для вывода сообщений отладки на страницу.

\textbf{Формы}
Основной частью всей работы являются классы форм.
Выделяется один основной класс, BaseForm, от которого остальные формы наследуют функционал.

При создании формы в нее добавляются поля.
Каждое поле характеризуется именем, меткой, виджетом и валидатором.
Имя поля является внутренним идентификатором.
Его значение подставляется в качестве атрибута name в элемент управления.
Метка отображается рядом с полем в теге <label>.
Она представляет собой "человеческое" название поля.
Виджет --- это объект, имеющий конфигурационные опции и методы для отображения поля.
В общем случае виджет не ограничивается одним элементом управления, что позволяет создавать поля любой сложности.
Валидатор также является объектом.
Он отвечает за проверку введенного значения и его очистку.
Например, он может проверять значение на количество символов.
Примером очистки служит освобождение текстового значения от лишних пробелов в начале и в конце строки.

Следующим этапом жизненного цикла формы является ее отображение.
С помощью агрегирующих методов собирается HTML-код полей и передается в шаблон.

После отправки формы пользователем, данные попадают на сервер.
Чтобы валидаторы могли проверить введенную информацию, ее необходимо привязать к форме.
Суть процесса заключается в передаче массива данных внутрь формы, распределения массива по полям и вызова валидаторов каждого из полей.

Если ни один из валидаторов не обнаруживает ошибки, данные считаются безопасными.
Их можно вставить в базу данных или, как происходит в разработанной программе, отправить на электронную почту.

Если пользователь все же допустил ошибки при вводе (например, забыл заполнить поле "Имя"), форма снова отображается через шаблон.
Отличие этого шага от предыдущего заключается в том, что теперь рядом с полями стоят описания ошибок, а сами поля содержат введенные ранее значения.  

\textbf{Отправка почтового сообщения}
Для отправки сообщения используется готовый компонент под названием PHPmailer.
В реализации данного функционала было принято решение руководствоваться принципом повторного использования кода на том основании, что новизны в функционале нет.
К тому же, PHPmailer имеет множество настроек и может посылать письма как по протоколу POP3, так и по SMTP.

%%% Local Variables:
%%% mode: latex
%%% coding: utf-8-unix
%%% TeX-master: "../default"
%%% End:
